perm filename TENDMP.DEC[SS,SYS]1 blob
sn#076131 filedate 1973-12-05 generic text, type T, neo UTF8
TITLE TENDMP - DTAPE/MTAPE UTILITY - R CLEMENTS/GBH/RH/RD/RCC/JEF 6 APR 71 - V032
IFNDEF REL,<REL=0> ;0 PAPER TAPE, 1 RELOCATABLE BINARY
IFNDEF MAGT,<MAGT=0> ;0 DTAPE, 1 MTAPE
IFN MAGT,<
; MAGTAPE UTILITY ROUTINE - COURTSEY DATALINE SYSTEMS J HANCOCK
>
IFNDEF MODE,<MODE=0> ;0 IS TD10, 1 IS 551/136
IFNDEF CORE,<CORE=4> ;NUMBER OF 8K MEMORY BLOCKS
IFE MODE,<SUBTTL TD10 VERSION>
IFN MODE,<SUBTTL 551/136 VERSION>
IFE REL,<
IFE MAGT,<RIM10B>
IFN MAGT,<RIM10>>
UTC=210
UTS=214
DC=200
DTC=320
DTS=324
F=0 ;MUST BE 0. USED BY JRA'S
A=2 ;MISC TEMP. HOLDS 136 CONO INDEX IN UWAIT
B=1 ;TEMP. HOLDS BLOCK # COMPUTATION IN SEARCH
C=3 ;HOLDS BITS FOR DECTAPE CONO DURING I/O
D=4 ;HOLDS POINTERS FOR AOBJN'S THROUGH CORE
E=5 ;HOLDS COUNT OF WORDS IN CURRENT DT BLOCK
P=6 ;PC FOR JSP'S
CKS=7 ;HAD BEEN CHECKSUM IN MACDMP
FILN=10 ;NUMBER OF FILE IN DIRECTORY, 1 TO 26 OCTAL
BLKNO=11 ;BLOCK NUMBER SEARCHED FOR ON TAPE
WRITE=12 ;MULTI-STATE FLAG FOR DEFINING I/O OPERATION
;1=D 0=K -1=ELSE
PNTR=13 ;POINTER TO BYTE TABLE IN DIRECTORY
CH=14 ;HOLDS 6BIT CHARACTER OF COMMAND, OR -1
Q=15 ;ANOTHER JSP AC
G=16 ;RARELY USED VERY TEMP
CT=17 ;COUNT OF WORDS TO DUMP
COMPTR=BEGR+377 ;COMMAND POINTER, IF SUPPLIED
LOZAD=BEGR-203 ;WHEN CORE IS CLEARED, IT
;IS FROM 40 THRU LOZAD
LOW=20 ;FIRST LOCATION CONSIDERED FOR DUMPING
HIGH=BEGR-203 ;LAST LOCATION CONSIDERED FOR DUMPING
;ZEROED AT BEG THESE DAYS
FOOF=BEGR-202 ;NEEDED FOR ZERO CORE SEARCH, ZEROED AT BEG1
TAB=BEGR-201 ;FILE DIRECTORY
LINK=BEGR-1 ;0-17=LINK, 18-27=FBN, 29-35=WC
IFE REL,<IFE MAGT,<LOC 17400+<<CORE-1>*20000>>
IFN MAGT,<LOC 17377+<<CORE-1>*20000>
IOWD LAST-BEGR+1,BEGR>>
;INITIAL ENTRY IS AT BEGR, UNLESS A COMMAND POINTER IS
;SUPPLIED IN COMPTR. IN THAT CASE, ENTRY IS AT BEGR+1
BEGR: SETZM COMPTR ;CLEAR ANY JUNK IN COMMAND POINTER
CONO 635550 ;I/O RESET, ETC.
BEG: JSP P,CRR ;TYPE A CR-LF
MOVEI D,SPNT-2 ;PREPARE TO REMOVE AOBJN POINTERS
BEG1: SETZB A,FOOF ;CLEAR A TO PUT IN CORE, CLEAR
;FOOF FOR THE NEXT ZERO CORE SEARCH
EXCH A,2(D) ;REMOVE HEADER LIST
AOBJN A,. ;COUNT THROUGH TO NEXT HEADER
MOVEI D,-1(A) ;ACCOUNT FOR OVERSHOOT IN AOBJN
JUMPN D,BEG1 ;IF WE DIDNT AOBJN A 0, GO FOR NEXT HDR
MOVE PNTR,[XWD 500,TAB-1] ;5 BIT BYTES IN DIRECTORY
SETZB CH,F
CRCH: SETOI WRITE,215 ;USED FOR CARRET TYPEOUT
TYI: SETZB C,HIGH ;HOPEFULLY HIGH IS TEMPORARY
SETZB B,E ;NAME INITIALIZING
TLOA B,400000 ;NULL NAME IS "@. "
SPACE: MOVEI E,C-1 ;EXTENSION INTO C
HRLI E,20600 ;FAKE OUT END TEST OF BYTE PTR
;STOP TAPE DRIVE
IFN MODE,<CONO UTC,0>
IFE MODE,<CONO DTC,400000>
NEXT: ILDB A,@BEGR ;GIVES A 0 UNLESS COMMAND POINTER SUPPLIED
;RH OF NEXT IS USED AS A CONSTANT
BELL: SETOI FILN,207 ;INITIALIZATION FOR SEARCH
SETZB BLKNO,CT ; "
SETZM LINK
JUMPN A,RCH ;JUMP IF COMMAND READ FROM CORE
CONSO TTY,40 ;TYPEIN FLAG?
JRST .-1 ;NO,WAIT
DATAI TTY,A ;GET TYPED IN CHARACTER
JSP P,TYO ;ECHO IT (WITH PARITY)
RCH: ANDI A,177 ;STRIP OFF PARITY
CAIN A,177 ;RUBOUT?
JRST BEGR ;YES. RESTART TENDMP
CAIE A,33 ;NEW ALTMODE?
CAIL A,175 ;OR 175 OR 176 ALTMODES?
JRST ALTTST ;YES, SOME ALTMODE.
CAIL A,140 ;LOWER CASE CHARACTER?
TRZ A,40 ;YES. CHANGE TO UPPER CASE
SUBI A,40 ;CONVERT TO SIXBIT
JUMPL A,CARRET ;ANY CONTROL CHARACTER
JUMPE A,SPACE ;CHAR WAS 40
NEXT1: TLNE E,770000 ;NO MORE THAN SIX CHARS
IDPB A,E ;GOES INTO AC1 = B
JRST NEXT ;GET ANOTHER CHARACTER
;HERE ON JUMP BLOCK DURING LOADS, OR NUMBER>7 ALT
JBLK:
;STOP TAPE DRIVE
IFN MODE,<CONO UTC,0>
IFE MODE,<CONO DTC,400000>
HRRM D,SADR ;SAVE STARTING ADDRESS
JUMPN CH,BEG ;IF NOT LOADGO COMMAND
SADR: JRST BEG ;CURRENT S.A.
LOADS: ;HERE TO LOAD TAPE TO CORE
MOVEI D,LOZAD+1 ;FIRST LOC NOT TO ZERO
SETZM 40 ;A "FEATURE"
MOVE C,[XWD 40,41] ;PREPARE TO CLEAR CORE.
TRNN CH,3 ;SKIP ON M,N NOT ON L,T,@
BLT C,-1(D) ;ZERO CORE
LOAD: JSP Q,LODUMP ;START READING FILE. LODUMP PROCESSES
;ONE HEADER AND ITS DATA
JRST LOAD ;IF OK, GET NEXT BLOCK.(IF NONE,
;LODUMP RETURNS TO JBLK.)
DELE: SKIPN E,WRITE ;SKIP IF NOT IN THE K PHASE OF A D COMMAND.
;OR A K COMMAND
;ALSO, SET E =0, SO SEARCH HAPPENS IN RBLK
CLS1: AOJA WRITE,CLSTP ; 0 TO 1. GO DUMP OUT DIRECTORY.
ERR: SKIPA P,NEXT ;SET TO RETURN TO BEGR
CRR: SKIPA A,CRCH ;LIKE HRROI A,215 AND SKIPA
SKIPA A,BELL ;GET A BELL CHARACTER
TYO: SKIPN COMPTR ;DONT TYO IF NO TYI, UNLESS ERR
DATAO TTY,A ;TYPE OUT
CONSZ TTY,20 ;WAIT FOR TTY TO FINISH
JRST .-1 ;NOT YET
CAIE A,215 ;IF CR TYPED IN,
JUMPGE A,(P) ;OR SIGN BIT OF CHAR ON,(SEE CRR)
MOVEI A,12 ;APPEND A LINEFEED
JRST TYO ;GO TYPE LF
ALTTST: TLNN B,4040 ;IF ALPHA CHARACTERS, DONT GET CH
LDB CH,E ;LAST CH BEFORE ALT, -40
JUMPN CH,ALTMD ;IF CH NOT NULL, GOT PROCESS ALTMODE
CARRET: MOVSI FILN,-26 ;FILE NAME SPECIFIED. FIRST THING TO
;DO IS LOOK IT UP IN DIRECTORY
LUP: SKIPN TAB+123(FILN) ;SEARCH FOR FREE FILE
SKIPE BLKNO,TAB+151(FILN) ;CHECK BOTH WORDS
TDZA BLKNO,BLKNO ;ENSURE CLEAR BLOCK NUMBER
HRRM FILN,FREE ;SAVE NUMBER OF A FREE FILE
HLLZ G,TAB+151(FILN) ;ONLY CHECK LEFT OF 2ND WD
CAMN B,TAB+123(FILN) ;SEARCH FOR TYPED-IN FILE
CAME C,G ;BOTH WORDS
AOBJN FILN,LUP ;NOT THIS ONE. KEEP LOOKING
JUMPL FILN,BEG69 ;IF FILE FOUND, JUMP
JUMPLE WRITE,ERR ;IF NOT FOUND, BETTER BE DUMP
FREE: MOVEI FILN,. ;DUMP & NOT FOUND, MAKE ENTRY WHERE FREE
;(ADDRESS MODIFIED ABOVE)
SKIPE TAB+123(FILN) ;MAKE SURE HOLE AVAILABLE
JRST ERR ;NO FREE SLOTS
BEG69: MOVEI FILN,1(FILN) ;FILN IS FILE #+1; CLR LH
JUMPL WRITE,LOADS ;ALL LOAD INSTRUCTIONS
IFE MAGT,<
SKIPN WRITE ;DELETE? (K COMMAND)
SETZB B,C ;YES, KILL FILE
MOVEM B,TAB+122(FILN) ;CLEAR IF DELE, ENTER IF NEW DUMP
HLLZM C,TAB+150(FILN) ;BOTH WORDS
;FALL INTO DUMP ROUTINE
;WHICH IS A NO-OP FOR K
;DUMP WRITES OUT CORE ONTO TAPE
;DUMP THRU DUMP2-1 SETS UP POINTERS TO NON-ZERO CORE AREAS. THESE
;AOBJN POINTERS ARE CALLED "HEADERS", AND PRECEDE THE DATA WHEN
;THE TAPE IS WRITTEN.
;THE FIRST HEADER IS KEPT IN SPNT. SUCCESIVE HEADERS GO INTO THE FIRST
;ZERO WORD FOLLOWING THE BLOCK CORRESPONDING TO THE PREVIOUS HEADER.
;AFTER THE LAST NON-ZERO BLOCK IS (BY DEFINITION) A ZERO, WHICH
;TERMINATES THE HEADER LIST. THIS WORD MAY BE LOCATION FOOF (37176) IF
;CORE WAS FILLED UP TO THE BASE OF TENDMP.
DUMP: ;HERE ON D,K. (BLKN)=0, FILN SET UP
MOVN A,[XWD HIGH-LOW-1,-LOW+1] ;COUNTER TO EXAMINE
;CORE FOR BLOCKS OF 0
MOVEI CKS,SPNT-1 ;FIRST HEADER GOES INTO SPNT
DMP1: SKIPN 1(A) ;FIND SOME NON-ZERO CORE
AOBJN A,.-1 ;ZERO. KEEP LOOKING.
MOVEM A,D ;SAVE ADR
SKIPN 1(A) ;FIND SOME ZERO CORE
SKIPE 2(A) ;DON'T MAKE NEW BLOCK FOR 1 ZERO
AOBJN A,.-2 ;NON-ZERO. KEEP LOOKING
SUB D,A ;GET -COUNT IN BOTH HALVES OF D
SUBI CT,-1(D) ;COUNT N WORDS DATA, 1 HDR
ADDI D,(A) ;GET F.A.-1 IN RH OF D
MOVEM D,1(CKS) ;SAVE HEADER
JUMPGE D,.+2 ;ON DATA GROUPS,
MOVE CKS,A ;GET THE HEADER
;F.A.+W.C. IS ADR OF NEXT HEADER
;I.E., FIRST 0 AFTER NON-ZERO BLOCK
JUMPL A,DMP1 ;LOOP IF MORE CORE
LSH CKS,2 ;SHIFT CORE SIZ FOR DIR
SKIPLE WRITE ;IF DUMPING, SET JOBREL
HRRM CKS,TAB+150(FILN) ;PUT IN DIR
DMP2: MOVEI D,SPNT-1 ;SET UP TO FOLLOW THE HEADERS.
MOVEI CT,1(CT) ;CLR LH, COUNT JBLK
DMP3: MOVE D,1(D) ;GET HEADER
JUMPGE D,THRU ;IF NULL HEADER FOUND
MOVEI Q,DMP3 ;Q:= DMP3 AS A RETURN AFTER AOBJN
>
IFN MAGT,<
JRST ERR ;HOW DID WE GET HERE? DLS***
;DUMP WRITES OUT CORE ONTO MAGNETIC TAPE
;DUMP WRITES OUT A CORE IMAGE ON MAGNETIC TAPE WITHOUT
;ZERO COMPRESSION. THE RECORDS ARE 200(OCTAL) WORDS IN LENGTH
;AND BEGIN WITH WORD ZERO. BEFORE STARTING THE TAPE IS REWOUND.
;IT ASSUMES MTA0, AT LEAST FOR NOW.
MTC= 340
MTS= 344
DUMP: CONO MTC,1000 ;REWIND
CONSO MTS,300000 ;WAIT FOR BOT OR REWINDING
JRST .-1
CONSO MTS,40 ;TRANSPORT READY?
JRST .-1
SETZ A,
DUMP1: HRLI A,-200 ;WORDS PER BLOCK
CONO MTC,64100 ;START WRITE OPERATION
DUMP2: CONSO MTS,1 ;TD10 READY FOR DATA?
JRST .-1
DATAO MTC,(A) ;SEND OUT DATA
AOBJN A,DUMP2 ;POINT TO NEXT WORD AND LOOP
CONO MTS,1 ;STOP THE DRIVE
CONSO MTS,100 ;WAIT TILL STOPPED
JRST .-1
CONSZ MTS,464610 ;ANY ERRORS?
JRST ERR ;YES, GO RING BELL
AOSE [-CORE*20000/200+2] ;ALL CORE DUMPED?
JRST DUMP1 ;NO
CONO MTC,65100 ;WRITE END OF FILE
CONSO MTS,100 ;DONE?
JRST .-1
CONO MTC,65100
CONSO MTS,100
JRST .-1
JRST BEGR ;ALL DONE
>
LODUMP: JSP P,UWAIT
JFCL D ;IN/OUTPUT HEADER
JUMPGE D,JBLK ;IF JRST BLOCK READ. CANT HAPPEN ON WRITE
DMP5: JSP P,UWAIT
JFCL 1(D) ;IN/OUTPUT DATA WORD
AOBJN D,DMP5 ;COUNT DOWN THE HEADER
JRST (Q) ;END OF HEADER. TO DMP3 OR LOAD+1
;WRITE: 1=D 0=K -1=ELSE
THRU: JSP P,UWAIT ;WRITE OUT JRST BLOCK
JFCL SADR ;FROM LOC SADR
IFE MODE,< AOJL E,UWAIT1 ;FILL OUT BLOCK, TO GET CKSM OUT>
TRZA WRITE,-1 ;THEN SET WRITE TO 0, AND GO CLOBBER
;ANY FURTHER BLOCKS WITH THIS FILN
UWAIT: AOJL E,UWAIT1 ;RETURN ADDR = (P) DATA ADDR = @(P)
;E IS -WD COUNT IN BLOCK OR POSITIVE
;BYTE POINTER FIRST TIME THRU
HLRZ BLKNO,LINK ;SET TO FOLLOW LINK
MNLUP0: JUMPGE WRITE,MNLUP ;WRITING OR DELETING
JUMPN BLKNO,RBLK
MNLUP: AOSA BLKNO ;NEXT BLOCK IN THE DIRECTORY
MNLUP1: DPB B,PNTR ;FOR DELETE, 0 FILE NAME AND NUMBER
ILDB A,PNTR ;SEARCH FILE DIR
CAIN A,37
JRST DELE ;END OF TAB MARKER, DELE GOES TO
;CLSTP ON A "D" TO DUMP DIRECTORY
TLO A,-1(WRITE) ;0 ON D, -1 ON K OR K PHASE OF D
CAIE FILN,(A) ;IS THIS BLOCK ASSIGNED TO CURRENT FILE?
JUMPN A,MNLUP ;OR MAYBE FREE? JUMP IF IN USE BY
;ANOTHER FILE.
DPB FILN,PNTR ;SMASH AWAY WRITE BLOCK ON D OR K. BUT
;SEE MNLUP1 ON K.
JUMPE WRITE,MNLUP1 ;K COMMAND
SKIPN C,LINK ;HAS LINK BEEN SET UP?
DPB BLKNO,[XWD 101200,LINK] ;NO. PUT BLOCK IN AS FIRST BLK NO
HRLM BLKNO,LINK ;PUT BLOCK IN AS LINK
JUMPE C,MNLUP0 ;JUMP IF THIS IS THE FIRST PASS THRU DIRECTORY
HLRZ BLKNO,C ;GET LINKED BLOCK CHOSEN BEFORE
MOVEI C,177 ;PUT IN A WORD COUNT FOR PIP
IORM C,LINK ;AND PUT ALL THAT INTO LINK WORD
SUBI CT,177 ;DECREMENT WORDS LEFT TO GO
;RBLK SEARCHES FOR THE BLOCK IN BLKNO, ENTERS IT GOING FORWARD,
;AND THEN READS INTO CORE, DUMPS CORE, OR COMPARES CORE AS
;DETERMINED BY CONTENTS OF WRITE.
RBLK: HRRO C,TAPENO ;CURRENT TAPE NO.
;SET LH TO PREPARE FOR JUMPN IN DELE
IFE MODE,<
TRO B,-1 ;ENSURE GOING FORWARD WHEN FIRST SEARCH
CONSO DTC,300000 ;IS A DIRECTION ASSERTED?
TRO C,210000 ;NO. GO FORWARD
RB1: TRNN B,400001 ;DECIDE WHETHER TO TURN AROUND
TRO C,300000 ;TURN AROUND
RBG: CONO DTC,20200(C) ;ISSUE THE COMMAND TO TD10.
;200=SEARCH, 300=READ, 700=WRITE.
UWAIT1: CONSZ DTS,672700 ;ANY ERRORS?
JRST ERR ;YES. GO DING AND THEN TYI
CONSO DTS,1 ;DATA READY?
JRST .-3 ;NO. GO WAIT SOME MORE
JUMPL E,INOUT(WRITE) ;IF IN MIDST OF A DT BLOCK, DISPATCH
DATAI DTC,B ;NO. SEARCHING. GET BLOCK NO.
TRZ C,310000 ;CLOBBER DIRECTION BITS IN CONO
SUBI B,(BLKNO) ;COMPARE WITH DESIRED BLOCK
CONSZ DTC,100000 ;COMPLEMENT DECISION IF GOING REVERSE
TRC B,-2 ;BIT 35 IS FOR TURNAROUND SPACE.
>
IFN MODE,<
SETOB A,B ;GO FORWARD, SET DC FOR SEARCH
CONSZ UTS,40 ;IS CHECKSUM BEING WRITTEN?
JRST .-1 ;WAIT
RB1: TRNN B,400001 ;DECIDE WHETHER TO TURN AROUND
TRCA C,10000 ;CHANGE DIRECTION AND DELAY
CONSO UTC,200000 ;UNIT SELECTED?
TRO C,2000 ;INVOKE STARTUP DELAY
RBG: CONO UTC,220200(C) ;COMMAND TO THE 551.
;200=SEARCH, 300=READ, 700=WRITE.
CONO DC,4011(A) ;COMMAND TO THE 136.
UWAIT1: CONSZ UTS,6 ;ANY ERRORS?
JRST ERR ;YES. GO DING AND THEN TYI
CONSO DC,1000 ;DATA READY?
JRST .-3 ;NO. WAIT SOME MORE
JUMPL E,INOUT(WRITE) ;IF IN MIDST OF A DT BLOCK, DISPATCH
DATAI DC,B ;NO. SEARCHING. GET BLOCK NUMBER
TRZ C,2000 ;DONT DELAY ANY MORE
SUBI B,(BLKNO) ;COMPARE WITH DESIRED BLOCK
TRNE C,10000 ;COMPLEMENT IF GOING REVERSE
TRC B,-2 ;BIT 35 IS FOR TURNAROUND SPACE.
>
JUMPN B,RB1 ;JUMP IF NOT GOING FORWARD INTO (BLKNO)
MOVNI E,200 ;WORDS PER BLOCK
MOVEM P,F ;SAVE RETURN IN AC0
TRO C,100 ;READ COMMAND, MAYBE
JUMPLE WRITE,RB2 ;JUMP IF READ
TRO C,400 ;CHANGE TO WRITE COMMAND
IFN MODE,<MOVNI A,401 ;SET 136 TO OUTPUT>
JUMPG CT,.+3
HRRZS LINK ;IF LAST BLK, KILL LINK
DPB E,PNTR ;AND THE DIR BYTE ← 0
RB2: CAIE BLKNO,↑D100 ;IF NOT DIRECTORY BLOCK
MOVEI P,.+2 ;SETUP NEW RETURN
JRST RBG
AOJ E,LINK ;IN/OUTPUT LINK
JRA P,UWAIT1 ;RESTORE CALLER ADR
;AND PROCESS DATA WORDS
IFE MODE,<
DATAI DTC,@(P) ;READ COMMANDS. GET WORD TO CORE
INOUT: JRST UWAIT2 ;INOUT-1 TO INOUT +1 ARE DISPATCHED TO.
DATAO DTC,@(P) ;OUTPUT TO TAPE
UWAIT2: AOJN E,UWAIT3 ;WAS THAT THE LAST WORD IN THE DT BLOCK?
CONO DTS,1 ;YES. GIVE FUNCTION STOP TO TD10
CONSO DTS,100000 ;AND WAIT FOR CHECKSUM TO BE DONE
JRST .-1 ;NOT YET. WAIT
UWAIT3: SOJA E,0(P) ;DONE. COMPENSATE FOR THE AOJN ABOVE, AND
;RETURN TO CALLER OF UWAIT OR RBLK
>
IFN MODE,<
DATAI DC,@(P) ;READ COMMANDS. GET WORD TO CORE
INOUT: JRST UWAIT2 ;INOUT-1 THRU INOUT+1 ARE DISPATCHED TO.
DATAO DC,@(P) ;OUTPUT TO TAPE
UWAIT2: JRST 0(P) ;RETURN TO CALLER OF UWAIT OR RBLK.
>
ALTMD: MOVEI A,"$"
JSP P,TYO ;ALTMODE IS PRINTED AS "$"
IFE MAGT,<
CAIE CH,"K"-40 ;FOR K, WRITE := 0
CAIN CH,"D"-40 ;FOR D, WRITE :=1
AOJLE WRITE,.-1 ;COUNT (WRITE)
>
IFN MAGT,<
CAIN CH,"D"-40 ;FOR D, WRITE :=1
AOJLE WRITE,.-1 ;COUNT (WRITE)
JUMPG WRITE,DUMP ;D MEANS GO DUMP ON MAG TAPE
>
CAIN CH,"G"-40 ;GO TO PROGRAM?
JRST @SADR ;YES. JUMP OUT
CAIN CH,"F"-40 ;FILE DIR PRINT?
JRST FDIR ;YES. PRINT FILE DIR OF THIS TAPE
CAIN CH,"Z"-40 ;ZERO DIRECTORY?
JRST ZDIR ;DISPATCH
CAILE CH,27 ;SKIP IF OCTAL NUMBER
JRST TYI ;NO. GO PROCESS FILE NAME
LSH B,3 ;CONVERT SIXBIT TO OCTAL
LSHC F,3 ;F+1=B
JUMPN B,.-2 ;MAY BE MORE THAN 1 DIGIT (START ADR)
CAILE F,7 ;SKIP IF ONE DIGIT
JRA D,JBLK ;D:=SADR. DISPATCH TO JBLK WHICH SAVES SADR.
OPNTP: ;SHIFT UNIT NUMBER LEFT FOR CONO
IFE MODE,<LSH F,11>
IFN MODE,<LSH F,3>
HRRM F,TAPENO ;SAVE IN CORE
CLSTP: MOVEI BLKNO,↑D100 ;BLK NO OF FILE DIR
SETZI PNTR,0 ;DONT CLOBBER DIRECTORY BYTE
JSP P,RBLK ;MOVE TO BLOCK 100
JFCL TAB+200(E) ;READ OR WRITE DIR TAB AS DETERMINED BY WRITE
AOJL E,UWAIT1 ;COUNT THE 200 WORDS
JRST BEG ;GO ASK FOR NEXT COMMAND
ZDIR: MOVE A,[XWD FOOF,TAB] ;FOOF IS CLEAR
BLT A,TAB+176 ;CLEAR DIRECTORY, EXCEPT LAST WORD FOR ID
MOVSI A,(36B4+36B9) ;RESERVE BLOCKS 1 & 2
MOVEM A,TAB ;IN DIRECTORY
MOVSI A,(36B9)
MOVEM A,TAB+16 ;BLK 100 (DIR) IS RESERVED TOO
HRLOI A,7 ;AND BLOCKS >1100 ARE EOT
MOVEM A,TAB+122 ;END OF BYTE TAB
AOJA WRITE,CLS1 ;SET WRITE TO OUTPUT
;AND DUMP BLK 100.
FDIR: MOVNI FILN,26 ;26 FILES (OCTAL)
FD2: JSP P,CRR ;CR-LF
FD3: SKIPN C,TAB+123+26(FILN) ;FIRST WORD OF NAME. IS IT BLANK?
AOJA C,FD1 ;YES. SET C=1 AND LOOP
JSP G,SIXBP ;PRINT FIRST WORD AND A SPACE
HLLZ C,TAB+151+26(FILN) ;SECOND WORD OF FILE NAME
JSP G,SIXBP ;PRINT AND CLEAR C
FD1: AOJL FILN,FD2(C) ;CAN JUMP TO FD2 OR FD3. COUNT FILES.
JRST BEG ;ALL FILES PRINTED OR BLANK. RETURN.
SIXBP: MOVEI B,7 ;SIXBP PRINTS C(C) IN 6BIT
;AND ADDS A TRAILING SPACE
;AND LEAVES (C)=0
TAPENO: ;USE ADR AS TEMP FOR CURRENT UNIT
SIXBP1: SETZI A,.-. ;CLEAR A
LSHC A,6
ADDI A,40 ;SIXBIT TO ASCII
JSP P,TYO ;TYPE OUT CHARACTER
SOJG B,SIXBP1 ;LOOP IF MORE CHARACTERS
JRST 0(G) ;RETURN
SPNT: 0 ;POINTER TO HEADERS IN CORE.
LIT
IFN MAGT,<
SLOP: MOVE .+3
MOVEM COMPTR
JRST BEGR+1
XWD 440700,.+1
BYTE (7) "0",33,177
LAST: JRST SLOP
>
IFE MAGT,<
SLOP=COMPTR-17-. ;THIS MANY WORDS BEFORE RESERVED AREA
;FOR COMMAND STRINGS.
;!!!!! NOTE: ABOVE PARAMETER MUST COME OUT POSITIVE IN
; ORDER TO MEET THE DOCUMENTATION OF RESERVED COMMAND STRING AREA.
;
; THIS MEANS ANY CODE ADDED MUST BE COMPENSATED FOR BY
; A CORRESPONDING TIGHTENING SOMEWHERE. GOOD LUCK.
; TENDMP IS VERY TIGHT ALREADY.
>
END BEGR